import pandas as pd
import matplotlib.pyplot as plt
from collections import defaultdict
import re

# 设置matplotlib以显示中文和负号
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 读取Excel文件
df = pd.read_excel('D:\\PyCharm 2022.3\\douban\\豆瓣电影top250数据.xlsx')  # 注意路径中的双反斜杠或使用原始字符串r'...'

# 使用正则表达式提取上映年份，并存入字典进行计数
year_count = defaultdict(int)
year_pattern = re.compile(r'(\d{4})')  # 匹配4位数字的年份
for movie_info in df['上映时间、电影类型']:
    match = year_pattern.search(movie_info)
    if match:
        year = match.group(1)  # 提取年份
        year_count[year] += 1

# 将字典转换为DataFrame，便于绘图
years = list(year_count.keys())
counts = list(year_count.values())
years_df = pd.DataFrame({'Year': years, 'Count': counts})

# 对年份进行排序
years_df = years_df.sort_values(by='Year')

# 绘制折线图
plt.figure(figsize=(12, 6))
plt.plot(years_df['Year'], years_df['Count'], marker='o', linestyle='-', color='b')
plt.title('每年上映的电影数量')
plt.xlabel('上映年份')  # 修改为“上映年份”以更准确地描述x轴
plt.ylabel('上映数量')
plt.xticks(rotation=45, ha='right')  # 旋转x轴标签，避免重叠，并设置水平对齐方式
plt.grid(True)  # 显示网格
plt.tight_layout()  # 自动调整子图参数, 使之填充整个图像区域
plt.show()